/**
 * 重新调整vue.config
 * 利于优化页面加载速度, 减少打包体积
 */
const path = require("path");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");

const debug = process.env.NODE_ENV !== "production";

// eslint-disable-next-line require-jsdoc
function resolve(dir) {
  return path.join(__dirname, dir);
}

module.exports = {
  // 基本路径
  publicPath: "./",
  // 输入文件目录
  outputDir: "./dists",
  // 放置生成的静态资源(js,css,font,img)的(相对于outputDir的)目录
  assetsDir: "assets",
  //  指定生成的'index.html'的输出路径(相对于outputDir).也可以指定一个绝对路径
  indexPath: "index.html",
  // 默认情况下生成的静态文件包含hash以便控制缓存.false关闭文件名哈希
  filenameHashing: true,
  // 是否开启eslint-loader保存检测,有效值 true|false|error
  lintOnSave: true,
  // 运行时版本是否需要编译，如果需要会让你的应用额外增加10kb左右
  runtimeCompiler: false,
  // 默认情况下 babel-loader 会忽略所有 node_modules 中的文件。如果你想要通过 Babel 显式转译一个依赖，可以在这个选项中列出来。
  // transpileDependencies: [/view-design.src.*?js$/],
  transpileDependencies: [],
  // 是否在构建生产包时生成 sourceMap 文件，false将提高构建速度
  productionSourceMap: false,
  // webpack配置， 值为对象时合并到最终配置中，为方法时改写配置
  // 配置 externals 引入 cdn 资源
  configureWebpack: (config) => {
    config.externals = {
      // vue: "Vue",
      // "vue-router": "VueRouter",
      // vuex: "Vuex",
      // axios: "axios",
      // echarts: 'echarts',
    };

    Object.assign(config, {
      // 开发生产共同配置
      resolve: {
        extensions: [".js", ".vue", ".json", ".css", ".ts"],
        alias: {
          "@": resolve("./src"),
          "@v": resolve("./src/views"),
          "@api": resolve("./src/api"),
          "@c": resolve("./src/components"),
        },
      },
    });
    const plugins = [];
    if (debug) {
      // 开发模式
    } else {
      // 生产模式
      plugins.push(
        new UglifyJsPlugin({
          uglifyOptions: {
            compress: {
              // eslint-disable-next-line camelcase
              drop_debugger: true,
              // eslint-disable-next-line camelcase
              drop_console: true, // 生产环境自动删除console
            },
            output: {
              beautify: true, // 压缩注释
            },
            warnings: false,
          },
          sourceMap: false,
          parallel: true, // 使用多进程并行运行来提高构建速度。默认并发运行数：os.cpus().length - 1。
        }),
      );
    }
    config.plugins = [...config.plugins, ...plugins];
  },
  chainWebpack: (config) => {
    config.resolve.symlinks(true); // 修复HMR
    config.module.rule("svg").exclude.add(resolve("src/icons")).end();
    config.module
      .rule("icons")
      .test(/\.svg$/)
      .include.add(resolve("src/icons"))
      .end()
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({
        symbolId: "icon-[name]",
      })
      .end();
    if (debug) {
      // 开发模式
    } else {
      // 生产模式
    }
  },
  // 配置高于chainWebpack中关于css loader的配置
  css: {
    extract: false, // 是否使用css分离插件 ExtractTextPlugin,采用独立样式文件载入，不采用<style>方式内联至html文件中
    sourceMap: false, // 是否在构建样式地图，false将提高构建速度
    loaderOptions: {
      sass: {},
      postcss: {
        plugins: [
          require("postcss-pxtorem")({
            // 把px单位换算成rem单位
            rootValue: 192, // 换算基数，
            unitPrecision: 3, // 允许REM单位增长到的十进制数字,小数点后保留的位数。
            propList: ["*"],
            exclude: /(node_module)/, // 默认false，可以（reg）利用正则表达式排除某些文件夹的方法，例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem，请把此属性设为默认值
            selectorBlackList: [".van"], // 要忽略并保留为px的选择器，本项目我是用的vant ui框架，所以忽略他
            mediaQuery: false, // （布尔值）允许在媒体查询中转换px。
            minPixelValue: 1, // 设置要替换的最小像素值
          }),
        ],
        // 这里的选项会传递给 postcss-loader
      },
    },
  },
  // 构建时开启多线程处理babel编译
  parallel: require("os").cpus().length > 1,
  pwa: {},
  // 第三方插件配置
  pluginOptions: {},
  devServer: {
    open: false,
    host: "0.0.0.0",
    port: "8080",
    https: false,
    hotOnly: false,
    disableHostCheck: true,
    // 如果你的前端应用和后端 API 服务器没有运行在同一个主机上，你需要在开发环境下将 API 请求代理到 API 服务器。这个问题可以通过  vue.config.js 中的 devServer.proxy 选项来配置。
    // proxy: "http://192.168.4.253:9999"
    // proxy: "http://192.168.0.82:9527"
    // proxy: "http://3343fe9669.51vip.biz" // 赵
    // proxy: "http://t45215039x.zicp.vip" // 高
    // proxy: {
    //   "/bus": {
    //     target: "http://127.0.0.1:8090",
    //     // target: "http://192.168.1.17:8888",
    //     ws: true,
    //     changOrigin: true
    //     // pathRewrite: {
    //     //   "/sys/v1/": "/sys/v1/"
    //     // }
    //   }
    // }
    // , before: app => {}
  },
};
